Date		:	4 aout 1991
		Protection	:	MOT DE PASSE
		Programme	:       STRATEGO
		Outils		:	SOFT-ICE V2.50, MASM, QUAID, EXE2BIN.
		Fichier		:	STRATEGO.EXE, FRED4.COM
		Temps pass�	:	1 HEURE
		Soci�t�		:	ACCOLADE
		Divers	        :	CREATION DU FICHIER FRED4.COM
		Origine		:	INDONESIE
		Num�ro		:	118


	On trouve relativement facilement l'endroit � alt�rer dans le fichier
	STRATEGO.EXE, il s'agit du saut suivant;

	983D:040D 3D0100	CMP 	AX,0001
	983D:0410 7563		JNZ	0475	; SAUTE SI MAUVAISE REPONSE...
	983D:0412 B84000	MOV	AX,0040

	Donc il s'agit uniquement de forcer le saut se trouvant en CS:0410 en
	0412 par un JMP 0412 ( EB00 ).
	Malheureusement cette chaine ne se trouve pas en clair. Je visualise
	l'ent�te du fichier pour m'apercevoir que c'est un fichier compact� par
	LZ91.
	Je d�compacte sur le champ mais cette fois-ci "on" me dit que le d�com-
	pactage ne peut fonctionner car ce fichier � l'air de contenir des
	overlays !!!
	Que reste-t-il � faire ? d�tourner une interruption et modifier le code
	en CS:0410 par un 74, ou un EB00.
	Je lance QUAID pour voir quelle interruption s'approche le plus de la
	demande de mot de passe.
	Il s'agit de l'INT 21 sous-fonction 49, mais ce n'est qu'au bout de la
	troisi�me fois que cette interruption est appel�e que la routine
	demandant le mot de passe est mise en place... ceci n'est pas trop
	g�nant il s'agira d�s lors de POPer le stack et de tester la position
	0410 pour voir si elle contient 75.


 ;	PATCH POUR LE PROGRAMME STRATEGO		3 aout 1991
 ;	FREDDY_SOFT

 code      segment
           org    100h
           assume cs:code

 start:    jmp    installe	; On va installer la routine r�sidente...

 cr        equ    0dh
 lf        equ    0ah
 flag      equ    49h ; Contenu de AH devant �tre test�.
 adr_ip    equ    0410h ; En ES:0410 il suffit de mettre 74.
 patch     equ    74h   ; � mettre � la place de 75 en ES:0410h
 
 instok    db     cr,lf,'    D�tournement de l',39,'INT 21 sous-fonction 49'
	   db     cr,lf
	   db     '                  ....FREDDY_SOFT....','$'
 drap      db     0,0
 elimine   db     cr,lf,'J',39,'ai en principe tout remis en l',39,'�tat....'
	   db     cr,lf,'$'

 int21     label  dword	; sauvegarde des adresses SEG:OFF de l'INT21 d'origine
 i40off    db     0,0	; OFFSET
 i40seg    db     0,0	; SEGMENT

 tsrint40  proc   far
           jmp short apr�s_id
	   db    'FR'	; On intercalle au d�but du code un identificateur
 apr�s_id: pushf
	   push ds
	   push ax
	   cmp byte ptr [drap],1	; Si 1 on devient transparent.
	   jz suite	; Saut � l'INT 21 toutes fonctions valid�es.
	   cmp ah,flag	; AH = 49.
	   jnz suite	; Si non on traite les INT 21 normalement.
	   push dx	; Transfert de DX dans DS ( �conomie de 2 inst.)
	   pop ds	; Dans ce cas je peux PUSHER et POPER puisque je ne
			; touche pas � SP.
	   cmp byte ptr ds:[adr_ip],75h
           jnz suite	; si c'est pas bon on sort.
           mov byte ptr ds:[adr_ip],patch
	   mov byte ptr [drap],1h
suite:	   pop ax	; On restaure tous les registres.
	   pop ds 
           popf	
	   jmp   int21	; Appel de l'INT21 officielle.
 tsrint40  endp
 eor:

 ; ROUTINE D'INSTALLATION

 installe: mov    ax,3521h
	   int    21h
           cmp word ptr es:[bx+2],'RF'	; On teste la pr�sence de la signature.
           je     away                  ; si pr�sent on d�sinstalle.
	   mov    ax,cs			; CS --> DS
           mov    ds,ax			; DS = CS
           mov    ax,3521h              ; on detourne l'int 21h.
           int    21h			; sous-fonction 35.
           mov    word ptr [i40off],bx  ; L'offset se retrouve en BX.
           mov    i40seg,es		; Le segment en ES.
           mov    ax,2521h              ; Et on met l'ad. du resident
           mov    dx,offset tsrint40	; sous-fonction 25 dont SEG:OFF se
           int    21h			; trouve en DX <---( tsrint40 ).
           mov    dx,offset instok      ; Offset du message de fin.
           mov    ah,09			; Sorti du message...
           int    21h
           mov    ah,07			; Attente d'un caract�re au clavier.
	   int    21h
           mov    dx,eor-start+100h+15	; On r�serve la m�moire qui doit rester
           mov    cl,4			; en r�sident: DEBUT code - FIN code +
           shr    dx,cl			; 100h + 15. ( 100h car les zones data
           mov    al,0			; sont plac�es de 0 � 100h dans un com.
					; Puis d�calage de 4 � droite pour avoir
					; le r�sultat en nombre de paragraphe 
					; + 1 ( ou + 15 comme ci-dessus ).
           mov    ah,31h                ; Sortie et reservation
           int    21h                   ; de la m�moire.
 away:     mov    dx,word ptr es:i40off	; Restauration de OFF:SEG de l'INT 21
           mov    ax,word ptr es:i40seg	; d'origine.
           mov    ds,ax
           mov    ax,2521h		; Set vecteur de l' INT 21
           int    21h
           mov    bx,es
           mov es,es:[2ch]
           mov ah,49h			; On lib�re la m�moire.
           int 21h
           mov es,bx
           mov ah,49h
           int 21h
           push cs			; Mettre CS dans DS 
           pop ds
           mov dx,offset elimine	; pointe sur d�but du message.
           xor al,al
           mov ah,9
           int 21h			; Sortir message.
           mov ah,4ch			
           int 21h			; On revient au DOS.
 code      ends
           end start